﻿namespace AlgoHero.Modelo
{
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;

    public class Partitura : IEnumerable
    {
        #region Atributos

        private int duracionDeCompas; //Duracion en semicorcheas
        private IList compases;

        #endregion

        #region Constructor

        public Partitura(int duracionDeCompas)
        {
            /* Crea una Partitura vacía y con la duración de compás recibida.
             * Precondición: duracionDeCompas deber ser un número entero positivo.
             * Postcondición: lanza una excepción ArgumentException si la duracionDeCompas no es válida.
             */
            if (duracionDeCompas <= 0)
            {
                throw new ArgumentException("La duración debe ser un número positivo.");
            }
                        
            this.duracionDeCompas = duracionDeCompas;
            compases = new List<Compas>();
        }

        #endregion

        #region Métodos

        public void AddCompas(Compas unCompas)
        {
            /* Precondición: unCompas debe tener una duración igual a la de la partitura.
             * Postcondición: Agregó el compás a la partitura si la duración es válida, caso
             * contrario lanza ArgumentException.
             */
            if (unCompas.CalcularDuracion() != this.duracionDeCompas)
            {
                throw new ArgumentException("El compás tiene una duración inválida");
            }

            compases.Add(unCompas);
        }

        public IEnumerator GetEnumerator()
        {
            /* Implementa un iterador para esta clase ("foreach") */
            for (int i = 0; i < this.compases.Count; i++)
            {
                yield return this.compases[i];
            }
        }

        public bool EsVacio()
        {
            return (this.compases.Count == 0);
        }


        #endregion
        
        #region Propiedades

        public int DuracionDeCompas
        {
            get { return duracionDeCompas; }
        }

        public IList Compases
        {
            get { return this.compases; }
        }

        #endregion


    }
}
